package modelo.servicio;

import java.util.List;
import modelo.bd.dao.SolicitudDAO;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Factura;
import modelo.dominio.Solicitud;

public class Solicitudes {

    private static Solicitudes instancia;
    private SolicitudDAO dao;

    private Solicitudes() {
        this.dao = new SolicitudDAO();
    }

    public static Solicitudes instancia() {
        if (instancia == null) {
            instancia = new Solicitudes();
        }
        return instancia;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return new CloneNotSupportedException("No se puede clonar Solicitudes.");
    }

    public void agregar(Solicitud solicitud) throws DAOException {
    }

    /**
     *
     * @param claveFlujo     Clave del Flujo
     * @param folioSolicitud Folio a procesar, enviar 0 cuando nuevo
     * @param clavePaso      Clave del Paso
     * @param monto          Monto Solicitud
     * @param claveEvento    Clave del evento Actual
     * @param comentarios    Comentarios
     * @param claveCausa     Clave de la Causa (Cuando requiera)
     * @param usuario        Usuario que realiza la accion
     * @return En caso que sea nuevo, un nuevo Folio.    
     *  Cuando Exista la Solicitud el mismo numero de Folio
     * @throws DAOException Lanza el error de la Base de datos.
     */
    public synchronized String procesar(String claveFlujo, long folioSolicitud, String clavePaso,
            double monto, String claveEvento, String comentarios, String claveCausa,
            String usuario) throws DAOException {
//        if (comentarios != null) {
//            comentarios = comentarios.replace("'", "''");
//        }
//        if (claveCausa != null) {
//            claveCausa = claveCausa.replace("'", "''");
//        }
        String resultado = dao.procesar(claveFlujo, folioSolicitud,
                clavePaso, claveEvento,
                monto, usuario, comentarios, claveCausa);
        return resultado;
    }

    public void editar(Solicitud solicitud, String usuario) throws DAOException {
    }

    public List<Solicitud> todos() throws DAOException {
        return dao.selectFacturas("");
    }

    public List<Solicitud> porRango(String desde, String hasta) throws DAOException {
        return dao.selectFacturas("AND trunc(hifl_fecha) between TO_DATE('" + desde + "', 'dd/MM/yyyy') "
                + "AND TO_DATE('" + hasta + "', 'dd/MM/yyyy')");
    }

    public Solicitud porClave(String claveFlujo, long folio) throws DAOException {
        try {
            List<Solicitud> ls = dao.selectFacturas("AND    hifl_fluj_clave       = '" + claveFlujo.replace("'", "''") + "' \n"
                    + "AND    hifl_numero           = " + folio);
            return ls.get(0);
        } catch (Exception e) {
            return null;
        }
    }

    public List<Solicitud> delResponsable(String usuario) throws DAOException {
        return dao.selectWhere("AND    repf_uspe_clave  = '" + usuario + "' ");
    }

    public List<Solicitud> obtenerPendientes(String usuario) throws DAOException {
        return dao.selectFacturas("AND    hifl_terminado       = 'N' \n"
                + "AND    EXISTS          ( SELECT 'X' \n"
                + "                         FROM   sil_responsables_paso_flujo \n"
                + "                         WHERE  repf_fluj_clave   = hifl_fluj_clave \n"
                + "                         AND    repf_pafl_clave   = hifl_pafl_clave \n"
                + "                         AND    repf_es_aprobador = 'S' \n"
                + "                         AND    repf_uspe_clave   = '" + usuario + "' \n"
                + "                         AND    repf_uspe_clave   = DECODE(pfl1.pafl_tipo_paso, 'I', dehf_uspe_clave, repf_uspe_clave) \n"
                + "                       ) \n"
                + "AND    NOT EXISTS      ( SELECT 'X' \n"
                + "                         FROM   sil_detalle_historico_flujo \n"
                + "                         WHERE  dehf_fluj_clave  = hifl_fluj_clave \n"
                + "                         AND    dehf_hifl_numero = hifl_numero \n"
                + "                         AND    dehf_pafl_clave  = hifl_pafl_clave \n"
                + "                         AND    dehf_instancia   = hifl_instancia \n"
                + "                         AND    dehf_uspe_clave  = '" + usuario + "')");
    }
}
